from enum import Enum

import uvicorn
from fastapi import FastAPI

app = FastAPI()

# @app.get("/")
# def root():
#     return {"msg": "helloworld"}

'''
那么如何让它带参数呢，其实很简单,用{ } 包裹着参数即可
'''

# @app.get('/{name}')
# def root(name):
#     return {"name": name}

'''
同样是可以返回对应的数据的。

 如果我们不带这个路径参数，会返回什么呢
 
 >>>>
 {
    "detail": "Not Found"
}
'''

'''

如果想要约定name的数据类型是int，怎么约定呢

传参的时候可以做限制
'''


# @app.get('/{name}')
# def root(name: int):
#     return {"name": name}


'''
访问 http://127.0.0.1:8000/123   

>>>
    {
    "name": 123
    }
    
如果我们传递的不是int类型，接口给我们返回的结果是什么

访问 http://127.0.0.1:8000/asdm

>>>
{
    "detail": [
        {
            "loc": [
                "path",
                "name"
            ],
            "msg": "value is not a valid integer",
            "type": "type_error.integer"
        }
    ]
}
    
    
    
访问 http://127.0.0.1:8000/docs  查看接口文档的时候可以看到    name 参数做了整型输入限制
'''


# 假设你有另外一个路径参数one，如下

@app.get('/one')
def root():
    return {"one": "lxq"}

'''
访问  http://127.0.0.1:8000/one
这个时候，你说请求one应该返回什么？

正常我们想着应该返回{"one": 'lxq'}，结果却是报错

  因为fastapi会按照路径的顺序匹配，当你输入one，默认匹配的是第一个带参数的路径，那么我们现在调整下   
  
  把2个视图函数前后位置对调一下   
'''

'''
我们在编写代码的时候，一定要注意，相同匹配的时候，默认只会按照顺序匹配。

我们在之前的带参数路径请求的函数中，我们有这样的需求，我们要求只能输入我们规定的数据，才能返回对应的数据。

这个时候呢，推荐用枚举Enum，我们看下如何实现的。
        
'''


class ModelName(str, Enum):
    beijing = "1"
    shanghai = "2"


@app.get("/{name}")
def root2(name: ModelName):
    if name == ModelName.beijing:
        return "北京欢迎你"
    if name == ModelName.shanghai:
        return "您好上海"

'''
访问接口文档看一下，只能进行选择 1 和 2，其他也没法输入。
'''


if __name__ == '__main__':
    uvicorn.run(app="main:app", host="127.0.0.1", port=8000, reload=True, debug=True)
